package com.yic.module.device.service.inspectionDeviceEntry;

import org.springframework.stereotype.Service;
import javax.annotation.Resource;

import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.validation.annotation.Validated;

import java.util.*;
import com.yic.module.device.controller.admin.inspectionDeviceEntry.vo.*;
import com.yic.module.device.dal.dataobject.inspectionDeviceEntry.InspectionDeviceEntryDO;
import com.yic.framework.common.pojo.PageResult;

import com.yic.module.device.convert.inspectionDeviceEntry.InspectionDeviceEntryConvert;
import com.yic.module.device.dal.mysql.inspectionDeviceEntry.InspectionDeviceEntryMapper;

import static com.yic.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.yic.module.device.enums.ErrorCodeConstants.*;

/**
 * 设备与检查项关联 Service 实现类
 *
 * @author 系统管理员
 */
@Service
@Validated
public class InspectionDeviceEntryServiceImpl implements InspectionDeviceEntryService {

    @Resource
    private InspectionDeviceEntryMapper inspectionDeviceEntryMapper;
    @Resource
    private TransactionTemplate transactionTemplate;

    @Override
    public Long createInspectionDeviceEntry(InspectionDeviceEntryCreateReqVO createReqVO) {
        // 插入
        InspectionDeviceEntryDO inspectionDeviceEntry = InspectionDeviceEntryConvert.INSTANCE.convert(createReqVO);
        inspectionDeviceEntryMapper.insert(inspectionDeviceEntry);
        // 返回
        return inspectionDeviceEntry.getId();
    }

    @Override
    public void updateInspectionDeviceEntry(InspectionDeviceEntryUpdateReqVO updateReqVO) {
        // 校验存在
        validateInspectionDeviceEntryExists(updateReqVO.getId());
        // 更新
        InspectionDeviceEntryDO updateObj = InspectionDeviceEntryConvert.INSTANCE.convert(updateReqVO);
        inspectionDeviceEntryMapper.updateById(updateObj);
    }

    @Override
    public void deleteInspectionDeviceEntry(Long id) {
        // 校验存在
        validateInspectionDeviceEntryExists(id);
        // 删除
        inspectionDeviceEntryMapper.deleteById(id);
    }

    private void validateInspectionDeviceEntryExists(Long id) {
        if (inspectionDeviceEntryMapper.selectById(id) == null) {
            throw exception(INSPECTION_DEVICE_ENTRY_NOT_EXISTS);
        }
    }

    @Override
    public InspectionDeviceEntryDO getInspectionDeviceEntry(Long id) {
        return inspectionDeviceEntryMapper.selectById(id);
    }

    @Override
    public List<InspectionDeviceEntryDO> getInspectionDeviceEntryList(Collection<Long> ids) {
        return inspectionDeviceEntryMapper.selectBatchIds(ids);
    }

    @Override
    public PageResult<InspectionDeviceEntryDO> getInspectionDeviceEntryPage(InspectionDeviceEntryPageReqVO pageReqVO) {
        return inspectionDeviceEntryMapper.selectPage(pageReqVO);
    }

    @Override
    public List<InspectionDeviceEntryDO> getInspectionDeviceEntryList(InspectionDeviceEntryExportReqVO exportReqVO) {
        return inspectionDeviceEntryMapper.selectList(exportReqVO);
    }

    @Override
    public Void createBatchInspectionDeviceEntry(List<InspectionDeviceEntryCreateReqVO> createReqVO) {
        transactionTemplate.execute(status -> {
            List<InspectionDeviceEntryDO> inspectionDeviceEntry = InspectionDeviceEntryConvert.INSTANCE.convert03(createReqVO);
            inspectionDeviceEntryMapper.insertBatch(inspectionDeviceEntry);
            return Boolean.TRUE;
        });
        return null;
    }

}
